// 单向队列


// 队列核心逻辑
class ArrayQueue {
    constructor(arrmMaxSize) {
        let maxSize = arrmMaxSize; // 表示数组最大容量
        let arr = []; // 队列数组，模拟队列
        let front = -1; // 队列头,指向队列头
        let rear = -1; // 队列尾，指向队列尾

        // 判断队列是否满
        this.isFull = () => {
            return rear === maxSize - 1;
        }

        // 判断队列是否为空
        this.isEmpty = () => {
            return rear === front;
        }

        // 添加数据到队列
        this.addQueue = (n) => {
            // 已满
            if (this.isFull()) {
                throw "队列已满";
                // 添加队列
            } else {
                rear++; // 让 rear 后移一位
                arr[rear] = n;
            }
        }

        // 取出队列
        this.getQueue = () => {
            // 为空
            if (this.isEmpty()) {
                throw "队列为空不能取数据";
                // 非空
            } else {
                front++
                return arr[front]
            }
        }

        // 显示队列的所有数据
        this.showQueue = () => {
            // 为空
            if (this.isEmpty()) {
                console.log("队列为空");
            } else {
                for (let i = this.front + 1; i <= this.rear; i++) {
                    console.log(`arr[${i}]=${arr[i]}`);
                }
            }
        }

        // 显示队列的头数据
        this.headQueue = () => {
            // 为空
            if (this.isEmpty()) {
                throw "队列为空没有数据";
            } else {
                return arr[front + 1];
            }
        }
    }
}

let arrayQueue = new ArrayQueue(3);




// 操作队列逻辑
const readline = require('readline')

let str = '\r\n请输入你的操作\r\n';
str += 's(show):显示队列\r\n';
str += 'e(exit):退出程序\r\n';
str += 'a(add):添加数据到队列\r\n';
str += 'g(get):从队列里取出数据\r\n';
str += 'h(head):查看队列头数据\r\n\r\n';

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: str
})
rl.prompt();
rl.on('line', async (line) => {
    switch (line.trim()) {
        case 's':
            arrayQueue.showQueue();
            break;
        case 'a':
            try {
                arrayQueue.addQueue(new Date() * 1);
            } catch (e) {
                console.log(e);
            }
            break;
        case 'g':
            try {
                console.log(arrayQueue.getQueue());
            } catch (e) {
                console.log(e);
            }
            break;
        case 'h':
            try {
                console.log(arrayQueue.headQueue());
            } catch (e) {
                console.log(e);
            }
            break;
        case 'e':
            rl.close();
            process.exit(0);
            break;
        default:
            console.log(`你输入的是：'${line.trim()}'`);
            break;
    }
    rl.prompt();
}).on('close', () => {
    console.log('再见!');
    process.exit(0);
})


// 总结： 到此队列基本实现完成,不过存在问题，当队列取完时，在添加队列就添加不上了